import pdfMake from 'pdfmake/build/pdfmake'
import pdfFonts from 'pdfmake/build/vfs_fonts'

// 注册字体 - 正确的方式
pdfMake.vfs = pdfFonts.vfs

/**
 * 将字体文件转换为base64编码并添加到pdfmake的虚拟文件系统
 * @param {string} fontPath - 字体文件路径
 * @param {string} fontFileName - 字体文件名（在vfs中的名称）
 * @returns {Promise<string>} 字体文件名
 */
const convertFontToBase64 = async (fontPath, fontFileName) => {
  try {
    // 使用fetch API获取字体文件
    const response = await fetch(fontPath)
    if (!response.ok) {
      throw new Error(`无法加载字体文件: ${fontPath}`)
    }
    
    // 获取ArrayBuffer
    const arrayBuffer = await response.arrayBuffer()
    
    // 转换为base64 - 正确的方式
    const uint8Array = new Uint8Array(arrayBuffer)
    let binaryString = ''
    for (let i = 0; i < uint8Array.length; i++) {
      binaryString += String.fromCharCode(uint8Array[i])
    }
    const base64 = btoa(binaryString)
    
    // 添加到pdfmake的虚拟文件系统
    pdfMake.vfs[fontFileName] = base64
    
    return fontFileName
  } catch (error) {
    console.error('字体转换错误:', error)
    throw error
  }
}

/**
 * 初始化PDF字体配置
 * 异步加载并配置NotoSansSC字体
 */
const initPdfFonts = async () => {
  try {
    // 转换NotoSansSC-Thin字体为base64并添加到vfs
    const notoSansSCFontFile = await convertFontToBase64('/fonts/chinese/NotoSansSC-Thin.woff2', 'NotoSansSC-Thin.woff2')
    
    // 配置字体 - 使用vfs中的字体文件名
    pdfMake.fonts = {
      ...pdfMake.fonts,
      // 使用pdfmake内置的字体作为后备
      Roboto: {
        normal: 'Roboto-Regular.ttf',
        bold: 'Roboto-Medium.ttf',
        italics: 'Roboto-Italic.ttf',
        bolditalics: 'Roboto-MediumItalic.ttf'
      },
      // 添加NotoSansSC字体族 - 使用vfs中的字体文件名
      NotoSansSC: {
        normal: notoSansSCFontFile,
        bold: notoSansSCFontFile,
        italics: notoSansSCFontFile,
        bolditalics: notoSansSCFontFile
      }
    }
    
    console.log('NotoSansSC字体配置成功')
    return true
  } catch (error) {
    console.warn('NotoSansSC字体加载失败，使用Roboto作为后备字体:', error)
    return false
  }
}

// 立即初始化字体
let fontsInitialized = false
initPdfFonts().then(success => {
  fontsInitialized = success
})

/**
 * PDF服务类
 * 提供复杂的表单生成和PDF创建功能
 */
class PdfService {
  constructor() {
    this.docDefinition = {
      pageSize: 'A4',
      pageMargins: [40, 60, 40, 60],
      defaultStyle: {
        font: fontsInitialized ? 'NotoSansSC' : 'Roboto',
        fontSize: 12,
        lineHeight: 1.5
      }
    }
    
    // 监听字体初始化完成
    this._waitForFontInitialization()
  }

  /**
   * 等待字体初始化完成
   * @private
   */
  async _waitForFontInitialization() {
    const maxWaitTime = 5000 // 最大等待5秒
    const startTime = Date.now()
    
    while (!fontsInitialized && Date.now() - startTime < maxWaitTime) {
      await new Promise(resolve => setTimeout(resolve, 100))
    }
    
    if (fontsInitialized) {
      this.docDefinition.defaultStyle.font = 'NotoSansSC'
      console.log('PDF服务已切换到NotoSansSC字体')
    }
  }

  /**
   * 创建业务报告PDF
   * @param {Object} formData - 表单数据
   * @returns {Object} PDF文档定义
   */
  createBusinessReport(formData) {
    const docDefinition = {
      ...this.docDefinition,
      header: this._createHeader(formData),
      footer: this._createFooter(),
      content: [
        this._createTitle('业务分析报告'),
        this._createInfoSection(formData),
        this._createTableSection(formData),
        this._createChartSection(formData),
        this._createSummarySection(formData),
        this._createSignatureSection()
      ],
      styles: this._getStyles()
    }

    return docDefinition
  }

  /**
   * 创建表头
   * @param {Object} formData - 表单数据
   * @returns {Object} 表头内容
   */
  _createHeader(formData) {
    return {
      text: '业务管理系统 - 内部文档',
      style: 'header',
      alignment: 'right',
      margin: [0, 20, 40, 0]
    }
  }

  /**
   * 创建页脚
   * @returns {Object} 页脚内容
   */
  _createFooter() {
    return function(currentPage, pageCount) {
      return {
        text: `第 ${currentPage} 页 / 共 ${pageCount} 页`,
        style: 'footer',
        alignment: 'center',
        margin: [0, 20, 0, 0]
      }
    }
  }

  /**
   * 创建标题
   * @param {string} title - 标题文本
   * @returns {Object} 标题内容
   */
  _createTitle(title) {
    return {
      text: title,
      style: 'title',
      alignment: 'center',
      margin: [0, 0, 0, 30]
    }
  }

  /**
   * 创建信息部分
   * @param {Object} formData - 表单数据
   * @returns {Array} 信息内容数组
   */
  _createInfoSection(formData) {
    return [
      {
        text: '报告基本信息',
        style: 'subheader',
        margin: [0, 0, 0, 15]
      },
      {
        columns: [
          {
            width: '*',
            stack: [
              { text: `报告编号: ${formData.reportNo || 'N/A'}` },
              { text: `生成日期: ${new Date().toLocaleDateString('zh-CN')}` },
              { text: `业务类型: ${formData.businessType || '常规业务'}` }
            ]
          },
          {
            width: '*',
            stack: [
              { text: `负责人: ${formData.manager || '管理员'}` },
              { text: `部门: ${formData.department || '业务部'}` },
              { text: `联系电话: ${formData.phone || 'N/A'}` }
            ]
          }
        ],
        margin: [0, 0, 0, 30]
      }
    ]
  }

  /**
   * 创建表格部分
   * @param {Object} formData - 表单数据
   * @returns {Object} 表格内容
   */
  _createTableSection(formData) {
    const tableData = formData.tableData || [
      { name: '业务收入', value: '¥1,234,567', trend: '上升', rate: '+15%' },
      { name: '用户数量', value: '10,000', trend: '稳定', rate: '+2%' },
      { name: '订单数量', value: '5,678', trend: '下降', rate: '-5%' },
      { name: '客户满意度', value: '92%', trend: '上升', rate: '+3%' }
    ]

    return {
      text: '业务数据统计',
      style: 'subheader',
      margin: [0, 0, 0, 15]
    },
    {
      table: {
        headerRows: 1,
        widths: ['*', 'auto', 'auto', 'auto'],
        body: [
          [
            { text: '指标名称', style: 'tableHeader' },
            { text: '数值', style: 'tableHeader' },
            { text: '趋势', style: 'tableHeader' },
            { text: '变化率', style: 'tableHeader' }
          ],
          ...tableData.map(item => [
            { text: item.name, style: 'tableCell' },
            { text: item.value, style: 'tableCell' },
            { text: item.trend, style: 'tableCell' },
            { text: item.rate, style: 'tableCell' }
          ])
        ]
      },
      layout: {
        fillColor: function(rowIndex) {
          return rowIndex === 0 ? '#f5f5f5' : null
        }
      },
      margin: [0, 0, 0, 30]
    }
  }

  /**
   * 创建图表部分（模拟）
   * @param {Object} formData - 表单数据
   * @returns {Object} 图表内容
   */
  _createChartSection(formData) {
    return {
      text: '数据分析图表',
      style: 'subheader',
      margin: [0, 0, 0, 15]
    },
    {
      text: '[此处显示业务数据趋势图表]',
      style: 'chartPlaceholder',
      margin: [0, 0, 0, 30]
    }
  }

  /**
   * 创建总结部分
   * @param {Object} formData - 表单数据
   * @returns {Object} 总结内容
   */
  _createSummarySection(formData) {
    return {
      text: '分析与建议',
      style: 'subheader',
      margin: [0, 0, 0, 15]
    },
    {
      ul: [
        '业务整体呈现稳定增长趋势，收入同比增长15%',
        '用户数量稳步增长，但需要关注用户活跃度',
        '订单数量有所下降，建议优化营销策略',
        '客户满意度持续提升，服务质量得到认可',
        '建议加强数据分析能力，完善监控预警机制'
      ],
      margin: [0, 0, 0, 30]
    }
  }

  /**
   * 创建签名部分
   * @returns {Object} 签名内容
   */
  _createSignatureSection() {
    return {
      columns: [
        {
          width: '*',
          text: ''
        },
        {
          width: 'auto',
          stack: [
            { text: '审核人：________________', margin: [0, 0, 0, 10] },
            { text: '日期：________________', margin: [0, 0, 0, 10] },
            { text: '业务管理系统生成', style: 'footer', margin: [0, 20, 0, 0] }
          ]
        }
      ]
    }
  }

  /**
   * 获取样式定义
   * @returns {Object} 样式对象
   */
  _getStyles() {
    return {
      header: {
        fontSize: 10,
        color: '#666666'
      },
      footer: {
        fontSize: 10,
        color: '#666666'
      },
      title: {
        fontSize: 20,
        bold: true,
        color: '#333333'
      },
      subheader: {
        fontSize: 14,
        bold: true,
        color: '#409EFF',
        margin: [0, 15, 0, 5]
      },
      tableHeader: {
        bold: true,
        fontSize: 12,
        color: '#333333',
        fillColor: '#f5f5f5'
      },
      tableCell: {
        fontSize: 11
      },
      chartPlaceholder: {
        italics: true,
        color: '#999999',
        alignment: 'center'
      }
    }
  }

  /**
   * 生成PDF文件
   * @param {Object} docDefinition - PDF文档定义
   * @param {string} fileName - 文件名
   * @returns {Promise} PDF生成Promise
   */
  generatePdf(docDefinition, fileName = 'business-report.pdf') {
    return new Promise((resolve, reject) => {
      try {
        const pdfDoc = pdfMake.createPdf(docDefinition)
        pdfDoc.getBlob((blob) => {
          const url = URL.createObjectURL(blob)
          resolve({ blob, url, fileName })
        })
      } catch (error) {
        reject(error)
      }
    })
  }

  /**
   * 下载PDF文件
   * @param {Object} docDefinition - PDF文档定义
   * @param {string} fileName - 文件名
   */
  downloadPdf(docDefinition, fileName = 'business-report.pdf') {
    pdfMake.createPdf(docDefinition).download(fileName)
  }

  /**
   * 打开PDF预览
   * @param {Object} docDefinition - PDF文档定义
   */
  openPdfPreview(docDefinition) {
    pdfMake.createPdf(docDefinition).open()
  }
}

export default new PdfService()